package com.lvmama.rhino.service.impl;

import java.util.Date;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.lvmama.rhino.entity.H5RuleVO;
import com.lvmama.rhino.entity.H5pageMonitorVO;
import com.lvmama.rhino.entity.PageMonitorVO;
import com.lvmama.rhino.mapper.H5PageMonitorChannelMapper;
import com.lvmama.rhino.mapper.H5PageMonitorNetworkTypeMapper;
import com.lvmama.rhino.mapper.H5PageMonitorOperatorsMapper;
import com.lvmama.rhino.mapper.H5PageMonitorRegionMapper;
import com.lvmama.rhino.mapper.H5RuleMapper;
import com.lvmama.rhino.mapper.PageMonitorMapper;
import com.lvmama.rhino.pojo.H5PageMonitorChannel;
import com.lvmama.rhino.pojo.H5PageMonitorNetworkType;
import com.lvmama.rhino.pojo.H5PageMonitorOperator;
import com.lvmama.rhino.pojo.H5PageMonitorRegion;
import com.lvmama.rhino.pojo.H5Rule;
import com.lvmama.rhino.pojo.H5RuleList;
import com.lvmama.rhino.pojo.OptionData;
import com.lvmama.rhino.pojo.PageMonitor;
import com.lvmama.rhino.pojo.PageMonitorInfo;
import com.lvmama.rhino.service.PageMonitorService;

@Service("pageMonitorService")
public class PageMonitorServiceImpl implements PageMonitorService{
    
    @Autowired
    private PageMonitorMapper pageMonitorMapper;
    
    
    @Autowired
    private H5RuleMapper h5RuleMapper;
    
    @Autowired
    private H5PageMonitorChannelMapper h5PageMonitorChannelMapper;
    
    
    @Autowired
    private H5PageMonitorOperatorsMapper h5PageMonitorOperatorsMapper;
    
    @Autowired
    private H5PageMonitorNetworkTypeMapper h5PageMonitorNetworkTypeMapper;
    
    @Autowired
    private H5PageMonitorRegionMapper h5PageMonitorRegionMapper;
    
    
    
    /**
     * 根据条件分页查询
     * @param param
     * @return
     */
    @Override
    public PageInfo<PageMonitor> queryPageMonitorList(PageMonitorVO pageMonitorVO) {
        PageHelper.startPage(pageMonitorVO.getPage(), pageMonitorVO.getPageSize());
        List<PageMonitor> pageMonitors = pageMonitorMapper.getMessageListPage(pageMonitorVO);
        PageInfo<PageMonitor> page = new PageInfo<PageMonitor>(pageMonitors);
        return page;
    }

    /**
     * 根据条件查询所有数据信息
     * @param pageMonitorVO
     * @return
     */
    @Override
    public List<PageMonitor> queryTimePageMonitorList(PageMonitorVO pageMonitorVO) {
        return pageMonitorMapper.queryTimePageMonitorList(pageMonitorVO);
    }
    
    @Override
    public List<PageMonitorInfo> queryTimePageMonitorInfoList(PageMonitorVO pageMonitorVO) {
        return pageMonitorMapper.queryTimePageMonitorInfoList(pageMonitorVO);
    }

    /**
     * 根据条件查询需要导出的数据
     * @param pageMonitorVO
     * @return
     */
    @Override
    public List<PageMonitor> queryExportPageMonitorList(PageMonitorVO pageMonitorVO) {
        return pageMonitorMapper.getMessageListPage(pageMonitorVO);
    }

    /**
     * 根据条件查询总的访问次数
     * @param pageMonitorVO
     * @return
     */
    @Override
    public Integer queryPageMonitorListCount(PageMonitorVO pageMonitorVO) {
        return pageMonitorMapper.queryPageMonitorListCount(pageMonitorVO);
    }

    /**
     * 查询各个时段的总量
     * @param pageMonitorVO
     * @return
     */
    @Override
    public OptionData queryOptionData(PageMonitorVO pageMonitorVO) {
        return pageMonitorMapper.queryOptionData(pageMonitorVO);
    }

    /**
     * 查询符合条件的数据
     * @param pageMonitorVO
     * @return
     */
    @Override
    public List<PageMonitorInfo> getMessageInfoListPage(PageMonitorVO pageMonitorVO) {
        return pageMonitorMapper.getMessageInfoListPage(pageMonitorVO);
    }

    /**
     * 查询分区是否存在
     * @param string
     * @return
     */
    @Override
    public String queryPartition(String dateStr) {
        return pageMonitorMapper.queryPartition(dateStr);
    }

    /**
     * 新建分区
     * @param string
     * @return
     */
    @Override
    public void createPartition(Map<String, Object> param) {
        pageMonitorMapper.createPartition(param);
    }

    /**
     * H5首屏统计
     */
	@Override
	public PageInfo<PageMonitor> H5pageMonitorSearchPage(H5pageMonitorVO h5pageMonitorVO) {
		PageHelper.startPage(h5pageMonitorVO.getPage(), h5pageMonitorVO.getPageSize());
		if (h5pageMonitorVO.getPage_type()!="1") {
			  List<PageMonitor> pageMonitors = pageMonitorMapper.H5pageMonitorSearchPage(h5pageMonitorVO);
			  PageInfo<PageMonitor> page = new PageInfo<PageMonitor>(pageMonitors);
		      return page;
		} else {
			List<PageMonitor> pageMonitors = pageMonitorMapper.H5pageMonitorSearchPageByPageType(h5pageMonitorVO);
	        PageInfo<PageMonitor> page = new PageInfo<PageMonitor>(pageMonitors);
	        return page;
		}
        
	}

	/**
	 * H5首屏统计导出-根据查询条件, 查询数据
	 */
	@Override
	public List<PageMonitor> H5pageMonitorSearchExport(H5pageMonitorVO h5pageMonitorVO) {
		if (!"1".equals(h5pageMonitorVO.getPage_type())) {
		      return  pageMonitorMapper.H5pageMonitorSearchPage(h5pageMonitorVO);
		} else {
	        return pageMonitorMapper.H5pageMonitorSearchPageByPageType(h5pageMonitorVO);
		}
	}

	
	/**
	 * 保存添加的规则
	 */
	@Override
	@Transactional(readOnly = false)
	public void saveH5Ruleform(H5Rule h5Ruleform, JSONObject jsonRules) {
		 if (StringUtils.isBlank(h5Ruleform.getId())) {
	            h5Ruleform.preInsert();
	            Date now = new Date();
	            h5Ruleform.setCreateDate(now);
	            h5Ruleform = insertUrl(h5Ruleform, jsonRules);
	            //保存规则类型名称
	            h5RuleMapper.insertRuleType(h5Ruleform);
	            if(!h5Ruleform.h5RuleList.isEmpty()){
	            	for (H5RuleList list : h5Ruleform.h5RuleList) {
	            		//保存规则配置
	            		if ("0".equals(list.getRuleOrder())) {
	            			list.setConditionName("and");	
	            		}
	            		h5RuleMapper.insertRuleList(list);
	            	}
	            }
		 }
		
	}
	
		
	public H5Rule insertUrl(H5Rule h5Ruleform, JSONObject jsonRules){
        JSONArray jsonRulesArray = jsonRules.getJSONArray("rules");
        H5RuleList ruleList=null;
        for (Object rule : jsonRulesArray) {
        	ruleList = new H5RuleList();
        	ruleList.setRuleId(h5Ruleform.getId());
        	ruleList.preInsert();
        	ruleList.setLinkUrl(((JSONObject) rule).getString("linkUrl"));
        	ruleList.setConditionName(((JSONObject) rule).getString("conditionName"));
        	ruleList.setRuleOrder(((JSONObject) rule).getString("ruleOrder"));
            h5Ruleform.h5RuleList.add(ruleList);
        }
        return h5Ruleform;
    }

	/**
	 *  查询添加的规则类型name
	 */
	@Override
	public List<H5Rule> queryAllRuleTypeName() {
		return h5RuleMapper.queryAllRuleTypeName();
	}

	/**
	 * 根据规则名id,查询出规则link_url
	 */
	@Override
	public List<H5RuleList> queryUrlByRuleId(String ruleId) {
		return h5RuleMapper.queryUrlByRuleId(ruleId);
	}

	/**
	 * 根据查询条件,取出渠道版本总量amount
	 */
	@Override
	public H5PageMonitorChannel queryTotal(Map<String, Object> map2) {
		return h5PageMonitorChannelMapper.queryTotal(map2);
	}
	

	/**
	 * 首屏耗时-渠道版本-根据查询条件，查找满足条件的数据
	 */
	@Override
	public List<H5PageMonitorChannel> queryH5PageMonitorChannel(Map<String, Object> map2) {
		return h5PageMonitorChannelMapper.queryH5PageMonitorChannel(map2);
	}

	@Override
	public List<H5PageMonitorOperator> queryH5PageMonitorOperator(
			Map<String, Object> map2) {
		return h5PageMonitorOperatorsMapper.queryH5PageMonitorOperators(map2);
	}

	
	/**
	 * 首屏耗时-运营商-根据查询条件, 取出运营商总量amount
	 */
	@Override
	public H5PageMonitorOperator queryTotalByOperators(Map<String, Object> map2) {
		return h5PageMonitorOperatorsMapper.queryTotalByOperators(map2);
	}

	/**
	 * 首屏耗时-网络制式-根据查询条件, 查找满足条件的数据
	 */
	@Override
	public List<H5PageMonitorNetworkType> queryH5PageMonitorNetworkType(
			Map<String, Object> map2) {
		return h5PageMonitorNetworkTypeMapper.queryH5PageMonitorNetworkType(map2);
	}

	/**
	 * 首屏耗时-网络制式-根据查询条件, 查找满足条件的数据
	 */
	@Override
	public H5PageMonitorNetworkType queryTotalByNetworkType(
			Map<String, Object> map2) {
		return h5PageMonitorNetworkTypeMapper.queryTotalByNetworkType(map2);
	}


	/**
	 * 首屏耗时-地域-根据查询条件, 查找满足条件的数据
	 */
	@Override
	public List<H5PageMonitorRegion> queryRegionProvinceList(
			Map<String, Object> map2) {
		return h5PageMonitorRegionMapper.queryRegionProvinceList(map2);
	}

	/**
	 * 根据查询条件,取出各个渠道版本样本量
	 */
	@Override
	public List<H5PageMonitorChannel> queryTotalGroupByChannel(
			Map<String, Object> map2) {
		return h5PageMonitorChannelMapper.queryTotalGroupByChannel(map2);
	}

	/**
	 * 根据查询条件,取出各个运营商样本量
	 */
	@Override
	public List<H5PageMonitorOperator> queryTotalGroupByOperator(
			Map<String, Object> map2) {
		return h5PageMonitorOperatorsMapper.queryTotalGroupByOperator(map2);
	}

	/**
	 * 根据查询条件,取出各个网络制式本样本量
	 */
	@Override
	public List<H5PageMonitorNetworkType> queryTotalGroupByNetworkType(
			Map<String, Object> map2) {
		return h5PageMonitorNetworkTypeMapper.queryTotalGroupByNetworkType(map2);
	}


	/**
	 * 维护规则起始列表页面
	 */
	@Override
	public PageInfo<H5Rule> H5pageMonitorMaintenancePage(H5RuleVO h5RuleVO) {
		    PageHelper.startPage(h5RuleVO.getPage(), h5RuleVO.getPageSize());
	        List<H5Rule> pageH5Rules = h5RuleMapper.queryMaintenanceListPage(h5RuleVO);
	        PageInfo<H5Rule> page = new PageInfo<H5Rule>(pageH5Rules);
	        return page;
	}

	/**
	 * 维护规则-删除-规则类型
	 */
	@Override
	public void deleteRuleType(String id) {
		 h5RuleMapper.deleteRuleType(id);
		
	}

	/**
	 * 维护规则-删除-配置规则
	 */
	@Override
	public void deleteRuleUrl(String ruleId) {
		 h5RuleMapper.deleteRuleUrl(ruleId);
	}

	/**
	 * 维护规则-编辑-查询元素
	 */
	@Override
	public H5Rule queryH5RuleListById(String id) {
		return  h5RuleMapper.queryH5RuleListById(id);
	}

	/**
	 *  维护规则-编辑-保存元素
	 */
	@Override
	public void saveEditRule(H5Rule h5Ruleform) {
		 h5RuleMapper.saveEditRule(h5Ruleform);
		
	}

}
